package com.cyou.nad.utils;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 
 * @author wl
 *
 */
public class CollectionsUtils {
	/**
	 * 将数组转换为list
	 * @param oa
	 * @return
	 */
	public static<T> List<T> array2List(T[] oa) {
        if(oa == null || oa.length == 0) {
            return null;
        }

        List<T> cl = Arrays.asList(oa);
        List<T> rsl = new ArrayList<T>();
        for(int i = 0; i < cl.size(); i++) {
            rsl.add(cl.get(i));
        }

        return rsl;
    }
	/**
	 * 获取数组交集
	 * @param a
	 * @param b
	 * @param c
	 * @return
	 */
	
	public static<T> T[] getIntersection(T[] a, T[] b, T[] c) {
		if(a == null || b == null || c == null) {
			return null;
		}

		List<T> sla = CollectionsUtils.array2List(a);
		List<T> slb = CollectionsUtils.array2List(b);
		sla.retainAll(slb);
		T[] r = sla.toArray(c);
		
		return r;
	}
	/**
	 * 填充list
	 * @param list
	 * @param data
	 * @param number
	 */

	public static<T> void fillList(List<T> list, T data, Integer number) {
		if(list == null) {
			return;
		}
		if(number == null || number <= 0) {
			throw new RuntimeException("number is invalid! " + number);
		}

		for(int i = 0; i < number; i++) {
			list.add(data);
		}
	}
/**
 * 按照size将list分割成几个size大小的数组，如果输入的是：【1，2,3,4,5】，2 最后取得的是【【1,2】，【3,4】，【5】】
 * @param list
 * @param size
 * @return
 */
    @SuppressWarnings("serial")
	public static<T> List<List<T>> devideList(final List<T> list, Integer size) {
    	if(list == null || size == null) {
    		throw new RuntimeException("list or size is null.");
    	}

    	if(size >= list.size()) {
    		return new ArrayList<List<T>>(){
    			{
    				add(list);
    				}
    			};
    	}

    	Integer lsize = list.size();
    	int count = lsize / size;
    	List<List<T>> rslt = new ArrayList<List<T>>();
    	for(int i = 0; i < count; i++) {
    		List<T> rs = new ArrayList<T>();
    		for(int j = i * size; (j < (i + 1) * size && j <= list.size()); j++) {
    			rs.add(list.get(j));
    		}
    		rslt.add(rs);
    	}

    	if(lsize % size != 0) {
    		rslt.add(list.subList(lsize - (lsize % size), lsize));
    	}

    	return rslt;
    }
    /**
     * 将字符串：比如”test“变为”getTest“
     * @param fieldName
     * @return
     */
    
	public static String getGetterName(String fieldName) {
		String first = fieldName.substring(0, 1);
		return "get" + first.toUpperCase() + fieldName.substring(1);
	}    
/**
 * 将data中的值通过getXXX方法获取，然后重新形成一个list，T应该是为了指定这个返回的list中装的是什么类型吧。
 * 比如：输入为 List<User> String name , User user   输出为list中每一个User的name形成的新list
 * @param data
 * @param property
 * @param c
 * @return
 */
    public static<T> List<T> makeListWithPojoPropertyOfList(List data, String property, T c) {
    	if(data == null || data.isEmpty()) {
    		return null;
    	}
    	List<T> result = new ArrayList<T>();
    	try {
    		for(Object o:data) {
    			Method mag = o.getClass().getMethod(getGetterName(property));
    			result.add((T) mag.invoke(o));
    		}
    	} catch (Exception e) {
    		e.printStackTrace();
    		return null;
    	}

    	return result;
    }
/**
 * 数组去重
 * @param array
 * @param type
 * @return
 */
    public static<T> T[] arrayDeduplicate(T[] array, T[] type) {
    	if(array == null || array.length == 0) {
    		return array;
    	}

    	Map<T,T> map = new LinkedHashMap<T,T>();
    	for(T t:array) {
    		map.put(t, t);
    	}

    	Set<T> set = map.keySet();
    	T[] r = set.toArray(type);
    	return r;
    }
	
}
